op {
  graph_op_name: "BlockLSTMV2"
  visibility: HIDDEN
  in_arg {
    name: "seq_len_max"
    description: <<END
Maximum time length actually used by this input. Outputs are padded
with zeros beyond this length.
END
  }
  in_arg {
    name: "x"
    description: <<END
The sequence input to the LSTM, shape (timelen, batch_size, num_inputs).
END
  }
  in_arg {
    name: "cs_prev"
    description: <<END
Value of the initial cell state.
END
  }
  in_arg {
    name: "h_prev"
    description: <<END
Initial output of cell (to be used for peephole).
END
  }
  in_arg {
    name: "w"
    description: <<END
The weight matrix.
END
  }
  in_arg {
    name: "wci"
    description: <<END
The weight matrix for input gate peephole connection.
END
  }
  in_arg {
    name: "wcf"
    description: <<END
The weight matrix for forget gate peephole connection.
END
  }
  in_arg {
    name: "wco"
    description: <<END
The weight matrix for output gate peephole connection.
END
  }
  in_arg {
    name: "b"
    description: <<END
The bias vector.
END
  }
  out_arg {
    name: "i"
    description: <<END
The input gate over the whole time sequence.
END
  }
  out_arg {
    name: "cs"
    description: <<END
The cell state before the tanh over the whole time sequence.
END
  }
  out_arg {
    name: "f"
    description: <<END
The forget gate over the whole time sequence.
END
  }
  out_arg {
    name: "o"
    description: <<END
The output gate over the whole time sequence.
END
  }
  out_arg {
    name: "ci"
    description: <<END
The cell input over the whole time sequence.
END
  }
  out_arg {
    name: "co"
    description: <<END
The cell after the tanh over the whole time sequence.
END
  }
  out_arg {
    name: "h"
    description: <<END
The output h vector over the whole time sequence.
END
  }
  attr {
    name: "cell_clip"
    description: <<END
Value to clip the 'cs' value to.
END
  }
  attr {
    name: "use_peephole"
    description: <<END
Whether to use peephole weights.
END
  }
  summary: "Computes the LSTM cell forward propagation for all the time steps."
  description: <<END
This is equivalent to applying LSTMBlockCell in a loop, like so:

```python
for x1 in unpack(x):
  i1, cs1, f1, o1, ci1, co1, h1 = LSTMBlock(
    x1, cs_prev, h_prev, w, wci, wcf, wco, b)
  cs_prev = cs1
  h_prev = h1
  i.append(i1)
  cs.append(cs1)
  f.append(f1)
  o.append(o1)
  ci.append(ci1)
  co.append(co1)
  h.append(h1)
return pack(i), pack(cs), pack(f), pack(o), pack(ci), pack(ch), pack(h)

Note that unlike LSTMBlockCell (and BlockLSTM) which uses ICFO gate layout,
this op uses IFCO. So in order for the following snippet to be equivalent
all gate-related outputs should be reordered.
```
END
}
